package com.sky.task;

import com.sky.dto.OrdersPageQueryDTO;
import com.sky.entity.Orders;
import com.sky.mapper.OrderMapper;
import com.sky.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单任务类
 */
@Component
@Slf4j
public class OrderTask {

    @Autowired // 订单业务层
    OrderMapper orderMapper;

    /**
     * 处理支付超时订单, 未支付订单超过15分钟就取消
     */
    //@Scheduled(fixedRate = 1000*60) // 每一分钟执行一次
    public void processTimeoutOrder(){
        LocalDateTime time = LocalDateTime.now().plusMinutes(-15); // 获取当前时间, 并减去15分钟

        // 查询状态未支付并且下单时间超过15分钟的订单
        List<Orders> ordersList = orderMapper.getByStatusAndOrdertimeLT(Orders.PENDING_PAYMENT, time);

        // 判断集合不为空并且长度大于0
        if(ordersList != null && ordersList.size() > 0){

            ordersList.forEach(order -> {
                order.setStatus(Orders.CANCELLED); // 订单状态设置为取消
                order.setCancelTime(LocalDateTime.now()); // 取消时间
                order.setCancelReason("订单长时间未支付"); // 取消原因
                // 持久层
                orderMapper.update(order);
            });
        }
    }

    /**
     * 处理“派送中”状态的订单, 每天凌晨1点钟把昨天未完成的订单设置为已完成
     */
    //@Scheduled(cron = "0 6 18 * * ?") // 每天凌晨1点执行一次
    public void processDeliveryOrder(){
        LocalDateTime time = LocalDateTime.now().plusMinutes(-60); // 获取当前时间, 并减去60分钟

        List<Orders> ordersList = orderMapper.getByStatusAndOrdertimeLT(Orders.DELIVERY_IN_PROGRESS, time);

        ordersList.forEach(order -> {
            order.setStatus(Orders.COMPLETED); // 订单状态设置为完成
            // 持久层
            orderMapper.update(order);
        });
    }
}
